package com.yeban.javase.day18.test.test1;

import java.util.concurrent.CountDownLatch;

/**
 * @Desc TODO
 * @Author yeban
 * @Date 2025/11/2
 *
 * 需求：
 * 线程1要执行打印：A和C，线程2要执行打印：B，
 * 但线程1在打印A后，要线程2打印B之后才能打印C，
 * 所以：线程1在打印A后，必须等待线程2打印完B之后才能继续执行。
 *
 * 多线程的情况下 C -> B -> A
 * sleep()、join()、CountDownLatch类、CyclicBarrier类、阻塞队列LinkedBlockingQueue等等
 *
 */
public class CountDownLatchCBA2 {

    public static void main(String[] args) {
        // 设置计数器为3
        CountDownLatch countDownLatch = new CountDownLatch(3);

        // 线程C
        Thread tC = new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
            // 计数器 -1 变成2
            countDownLatch.countDown();
        }, "线程C");

        // 线程B
        Thread tB = new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
            // 计数器 -1 变成1
            countDownLatch.countDown();
        }, "线程B");

        // 线程A
        Thread tA = new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
            // 计数器 -1 变成0
            countDownLatch.countDown();
        }, "线程A");

        //tA.start();
        //tB.start();
        //tC.start();

        tC.start();
        tB.start();
        tA.start();

        // 设置阻塞点：等待计数器减到 0 才会继续执行
        // 如果不设置阻塞点，主线程会先执行
        /*try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }*/

        // 主线程直接执行
        System.out.println("线程执行顺序为：C -> B -> A");
    }
}
